home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / swagg_m.zip / GRAPHICS.SWG < prev    next >
Text File  |  1993-05-28  |  8KB  |  1 lines

  1. SWAGOLX.EXE (c) 1993 GDSOFT  ALL RIGHTS RESERVED 00002         GRAPHICS ROUTINES                                                 1      05-28-9313:47ALL                      SWAG SUPPORT TEAM        DOTSPIN.PAS              IMPORT              22          program dotspin;ππvar inPort1:word;πprocedure waitRetrace;assembler;asmπ mov dx,inPort1; {find crt status reg (input port #1)}π@L1: in al,dx; test al,8; jnz @L1;  {wait for no v retrace}π@L2: in al,dx; test al,8; jz @L2; {wait for v retrace}π end;ππconstπ tableWriteIndex=$3C8;π tableDataRegister=$3C9;ππprocedure setColor(color,r,g,b:byte);assembler;asm {set DAC color}π mov dx,tableWriteIndex; mov al,color; out dx,al; inc dx;π mov al,r; out dx,al; mov al,g; out dx,al; mov al,b;out dx,al;π end; {write index now points to next color}ππ{plot a pixel in mode $13}πprocedure plot(x,y:word);Inline(π  $5E/                   { pop si  ;y}π  $5F/                   { pop di  ;x}π  $B8/$00/$A0/           { mov ax,$A000}π  $8E/$C0/               { mov es,ax}π  $B8/$40/$01/           { mov ax,320}π  $F7/$E6/               { mul si}π  $01/$C7/               { add di,ax}π  $26/$F6/$15);          {es: not byte[di]}ππprocedure plot4(x,y:word);const f=60;beginπ plot(x+f,y);π plot(199+f-x,199-y);π plot(199+f-y,x);π plot(y+f,199-x);π end;ππprocedure click;assembler;asmπ in al,$61; xor al,2; out $61,al;π end;ππconst nDots=21;ππvarπ dot:array[0..nDots-1]of recordπ  x,y,sx,sy:integer;π  end;ππfunction colorFn(x:integer):byte;beginπ colorFn:=63-(abs(100-x)div 2);π end;ππprocedure moveDots;var i:word;beginπ for i:=0 to nDots-1 do with dot[i] do beginπ  plot4(x,y);π  inc(x,sx);inc(y,sy);π  if(word(x)>200)then beginπ   sx:=-sx;inc(x,sx);click;π   end;π  if(word(y)>199)then beginπ   sy:=-sy;inc(y,sy);click;π   end;π  plot4(x,y);π  end;π waitRetrace;waitRetrace;waitRetrace;{waitRetrace;}π setcolor(255,colorFn(dot[0].x),colorFn(dot[3].x),colorFn(dot[6].x));π end;ππprocedure drawdots;var i:word;beginπ for i:=0 to nDots-1 do with dot[i] do plot4(x,y);π end;ππprocedure initDots;var i,j,k:word;beginπ j:=1;k:=1;π for i:=0 to nDots-1 do with dot[i] do beginπ  x:=100;y:=99;π  sx:=j;sy:=k;π  inc(j);if j>=k then begin j:=1;inc(k); end;π  end;π end;ππfunction readKey:char;Inline(π  $B4/$07/               {mov ah,7}π  $CD/$21);              {int $21}ππfunction keyPressed:boolean;Inline(π  $B4/$0B/               {mov ah,$B}π  $CD/$21/               {int $21}π  $24/$FE);              {and al,$FE}ππbeginπ inPort1:=memw[$40:$63]+6;π port[$61]:=port[$61]and (not 1);π setcolor(255,60,60,63);π initDots;π asm mov ax,$13; int $10; end;π drawDots;π repeat moveDots until keypressed;π readkey;π drawDots;π asm mov ax,3; int $10; end;π end.πππ * OLX 2.2 * Printers do it without wrinkling the sheets.ππ--- Maximus 2.01wbπ * Origin: >>> Sun Mountain BBS <<< (303)-665-6922 (1:104/123)π                                                                                                                     2      05-28-9313:47ALL                      SWAG SUPPORT TEAM        MCGATUT.TXT              IMPORT              40                                     MCGA Graphics Tutorialπ                                 Lesson #1π                                by Jim CookππI'm not sure how this online tutorial will be received, but with yourπcomments and feedback I plan on creating a full-blown animation package. Thisπgraphics library will be available to the public domain and will contain theπfollowing abilities:ππ                Setting/Reading Pixelsπ                Drawing linesπ                Saving/Restoring areas of the screenπ                Displaying PCX/LBM files to the screenπ                Spriting (Display picture with transparent areas)π                Palette control (Smooth fades to black)π                Page flippingππBefore we're done, you will have the tools to produce programs with rich,πeven photo-realistic (for the resolution) images on your PC.  The necessaryπhardware is a VGA card and monitor that's it.  I'll be using Turbo Pascalπversion 6.0.  Please holler if that will be a problem.  I'm using it toπcreate inline assembly.  My alternatives are inline code (yuk) or linking inπexternal assembly.  For speed (and actually ease) the latter is better.  If Iπreceive three complaints against 6.0, I'll use external assembly.ππ                                What is MCGA?ππMulti-Color Graphics Array is the video card that IBM built into it's Modelπ25 and 30 PS/2's.  It subsequently became a subset of the standard VGAπadapter card.  It has the distiction of being the first card (excludingπTarga and other expensive cards) to display 256 colors at once on theπcomputer screen.  To us that meant cool games and neat pictures.  The MCGAπaddapter has added two new video modes to the PC world:ππ                Mode $11        640x480x2 colorsπ                Mode $13        320x200x256 colorsππObviously, we will deal with mode $13.  If we wanted to deal with twoπcolors, we'd be programming a CGA.  So much for the history lesson...let'sπdive in.ππI've created a unit, MCGALib, that will contain all of our MCGA routines.πThe first two procedures we will concern ourselves with are setting theπgraphics mode and setting a pixel.  The MCGALib is followed by a testπprogram that uses the two procedures:ππUnit MCGALib;ππinterfaceππProcedure SetGraphMode (Num:Byte);πProcedure SetPixel     (X,Y:Integer;Color:Byte);ππimplementationππvarπ  ScreenWide  :  Integer;π  ScreenAddr  :  Word;ππProcedure SetGraphMode (Num:Byte);πbeginπ  asmπ    mov al,Numπ    mov ah,0π    int 10hπ    end;π  Case Num ofπ    $13 : ScreenWide := 320;π    end;π  ScreenAddr := $A000;πend;π{πFunction PixelAddr (X,Y:Word) : Word;πbeginπ  PixelAddr := Y * ScreenWide + X;πend;ππProcedure SetPixel (X,Y:Integer;Color:Byte);πvarπ  Ofs    :  Word;πbeginπ  Ofs := PixelAddr (X,Y);π  Mem [ScreenAddr:Ofs] := Color;πend;π}ππProcedure SetPixel (X,Y:Integer;Color:Byte);πbeginπ  asmπ    push dsπ    mov  ax,ScreenAddrπ    mov  ds,axππ    mov  ax,Yπ    mov  bx,320π    mul  bxπ    mov  bx,Xπ    add  bx,axππ    mov  al,Colorπ    mov  byte ptr ds:[bx],alπ    pop  dsπ    end;πend;ππBeginπEnd.ππThis is the test program to make sure it's working...ππProgram MCGATest;ππusesπ  Crt,Dos,MCGALib;ππvarπ  Stop,π  Start  :  LongInt;π  Regs   :  Registers;ππFunction Tick : LongInt;πbeginπ  Regs.ah := 0;π  Intr ($1A,regs);π= egs.cx hl 16  Rgs.dx;πend;ππProcedure Control;πvarπ  I,J :  Integr;beginπ  Start := ic;π  Fr I := 0 to 199 doπ  For J  SetPixe (J,I,Random(256));π Stop := Tick;πend;ππPocdure Closing;πvarπ  Ch    :  Chr;πbeginπ  Repet Until Keypressed;π  While Keypressed do Ch:= Reake;π  TextMode (3);πook '(Stop-Start),' ticks or ,(Stop-Start)/182:4:3,'π seconds!');πnd;ππProcedure Init;πbeginπ  SetGaphMode ($13);π Randoiz;πend;ππBeginπ Initπ  Control;π  Cosing;πe where these listings coul get unbearably long in time.  I'lπexplore a few ays I can get this information to ya'll without takingup tooπmuch pace. Iwould like you tomake sue this routine works, ust in caseπyou ou graphis card. You may notce two SetPxelπprocedures in the MCGALib, one is commented out.  Remove he comments,πcomment up the uncommented SetPixel and run the test program aain.  Noticeπthe speed degradation.  Linking in raw assembly will eve improve upon theπspeed of the inline assembly.πPlease take the time to study each procedure and ASK ANY QUESTIONS tht youπmay have, even if it doesn't relate to the graphics routines.  I'm cetain Iπdo not want to get pulled off track by any discussions about STYLE,ur critiqueπ for others to learn rom.ππ                              Coming next timeππI think a discussio of video memory is paramount.  Possibly vertical andπhorizontal lines, if spce permits.ππHappy grafxπjimππ--- QuickBBS 2.75π * Origin: Quantum Leap.. (512)333-5360  HST/DS (1:387/307)π